/**
 * @file protocol_manager.h
 * @brief 协议管理器接口
 * @details 统一管理和调度所有协议网关（IEC104、Modbus、OPC UA等）
 * 
 * @author zyb
 * @date 2025-10-30
 * @version 1.0
 */

#ifndef PROTOCOL_MANAGER_H
#define PROTOCOL_MANAGER_H

#include <stdint.h>
#include <stdbool.h>

#ifdef __cplusplus
extern "C" {
#endif

/* ==================== 数据结构定义 ==================== */

/**
 * @brief 协议类型
 */
typedef enum {
    PROTOCOL_TYPE_IEC104 = 0,          /* IEC 60870-5-104协议 */
    PROTOCOL_TYPE_MODBUS,              /* Modbus协议 */
    PROTOCOL_TYPE_OPCUA,               /* OPC UA协议 */
    PROTOCOL_TYPE_DLT645,              /* DL/T 645协议 */
    PROTOCOL_TYPE_MAX
} protocol_type_t;

/**
 * @brief 协议配置
 */
typedef struct {
    protocol_type_t type;              /* 协议类型 */
    bool enabled;                      /* 是否启用 */
    char config_file[512];             /* 配置文件路径 */
} protocol_config_t;

/**
 * @brief 协议管理器配置
 */
typedef struct {
    /* 通用配置 */
    char log_file[256];                /* 日志文件路径 */
    uint32_t log_level;                /* 日志级别 */
    
    /* 协议配置 */
    uint32_t protocol_count;           /* 启用的协议数量 */
    protocol_config_t protocols[PROTOCOL_TYPE_MAX];  /* 协议配置数组 */
    
} protocol_manager_config_t;

/**
 * @brief 协议状态
 */
typedef enum {
    PROTOCOL_STATUS_STOPPED = 0,       /* 已停止 */
    PROTOCOL_STATUS_STARTING,          /* 启动中 */
    PROTOCOL_STATUS_RUNNING,           /* 运行中 */
    PROTOCOL_STATUS_STOPPING,          /* 停止中 */
    PROTOCOL_STATUS_ERROR              /* 错误状态 */
} protocol_status_t;

/**
 * @brief 协议统计信息
 */
typedef struct {
    uint64_t uptime_seconds;           /* 运行时间(秒) */
    uint64_t messages_sent;            /* 发送消息数 */
    uint64_t messages_received;        /* 接收消息数 */
    uint64_t errors;                   /* 错误数 */
    protocol_status_t status;          /* 当前状态 */
} protocol_stats_t;

/* ==================== 函数声明 ==================== */

/**
 * @brief 初始化协议管理器
 * @details 初始化协议管理器模块
 * 
 * @param config 管理器配置
 * @return 0表示成功，-1表示失败
 */
int protocol_manager_init(const protocol_manager_config_t* config);

/**
 * @brief 启动协议管理器
 * @details 根据配置启动所有已启用的协议网关
 * 
 * @return 0表示成功，-1表示失败
 */
int protocol_manager_start(void);

/**
 * @brief 停止协议管理器
 * @details 停止所有运行中的协议网关
 * 
 * @return 0表示成功，-1表示失败
 */
int protocol_manager_stop(void);

/**
 * @brief 清理协议管理器
 * @details 清理协议管理器资源
 * 
 * @return 0表示成功，-1表示失败
 */
int protocol_manager_cleanup(void);

/**
 * @brief 获取协议状态
 * @details 获取指定协议的运行状态
 * 
 * @param type 协议类型
 * @return 协议状态
 */
protocol_status_t protocol_manager_get_status(protocol_type_t type);

/**
 * @brief 获取协议统计信息
 * @details 获取指定协议的统计信息
 * 
 * @param type 协议类型
 * @param stats 统计信息输出
 * @return 0表示成功，-1表示失败
 */
int protocol_manager_get_stats(protocol_type_t type, protocol_stats_t* stats);

/**
 * @brief 重启协议
 * @details 重启指定的协议网关
 * 
 * @param type 协议类型
 * @return 0表示成功，-1表示失败
 */
int protocol_manager_restart_protocol(protocol_type_t type);

#ifdef __cplusplus
}
#endif

#endif /* PROTOCOL_MANAGER_H */

